/*******************************************************************************
 *
 *
 *******************************************************************************/
#include "bsp.h"
#include "common.h"

#define APP_TIM TIM7
#define APP_TIM_PERIOD 1000

/******************************************************************************
 *	                            function
 *******************************************************************************/
uint32_t app_tick_init(uint32_t TickPriority);
void app_tick_suspend(void);
void app_tick_resume(void);
uint32_t app_tick_get(void);
uint32_t app_tick_us_get(void);
void app_tick_isr(void);

static void (*task_list[8])(void);

/******************************************************************************
 *	                            var
 *******************************************************************************/
static volatile uint32_t hal_tick_cnt = 0;
static vtask_vector_type task_vect;

/*******************************************************************************
 * @brief  app_tick_init
 * \param[in] none
 * \retval: none
 *******************************************************************************/
uint32_t app_tick_init(uint32_t TickPriority)
{
	vtask_list_init(&task_vect, task_list, arr_len(task_list), 0);

	return 0;
}

/*******************************************************************************
 * @brief  app_tick_suspend
 * \param[in] none
 * \retval: none
 *******************************************************************************/
void app_tick_suspend(void)
{
	APP_TIM->DIER = 0;
}

/*******************************************************************************
 * @brief  app_tick_resume
 * \param[in] none
 * \retval: none
 *******************************************************************************/
void app_tick_resume(void)
{
	APP_TIM->DIER = TIM_DIER_UIE;
}

/*******************************************************************************
 * @brief  app_tick_get
 * \param[in] none
 * \retval: none
 *******************************************************************************/
uint32_t app_tick_get(void)
{
	return hal_tick_cnt;
}

/*******************************************************************************
 * @brief  app_tick_us_get
 * \param[in] none
 * \retval: none
 *******************************************************************************/
uint32_t app_tick_us_get(void)
{
	uint32_t time_us;

	intx_alloc();

	intx_disable();

	time_us = hal_tick_cnt * APP_TIM_PERIOD;

	time_us += APP_TIM->CNT & 0x0000FFFF;

	intx_enable();

	return time_us;
}

/*******************************************************************************
 * @brief  app_tick_isr
 * \param[in] none
 * \retval: none
 *******************************************************************************/
void app_timer_isr(void)
{
	APP_TIM->SR = 0;

	hal_tick_cnt++;

	if (task_vect.list)
	{
		vtask_list_run_once(&task_vect);
	}
}

/*******************************************************************************
 * @brief  app timer task add
 * \param[in] none
 * \retval: none
 *******************************************************************************/
void app_timer_task_add(void (*task)(void))
{
	vtask_list_add(&task_vect, task);
}

/*******************************************************************************
 * @brief  app timer task del
 * \param[in] none
 * \retval: none
 *******************************************************************************/
void app_timer_task_del(void (*task)(void))
{
	vtask_list_del(&task_vect, task);
}
